/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.gov.fasepa.sgpf.bean;

import br.gov.fasepa.sgpf.entity.Servidor;
import br.gov.fasepa.sgpf.entity.Subsetor;
import br.gov.fasepa.sgpf.rn.ServidorRN;
import br.gov.fasepa.sgpf.util.JsfUtil;
import br.gov.fasepa.sgpf.util.SystemUtil;
import br.gov.fasepa.sgpf.util.Validator;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.primefaces.context.RequestContext;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;

/**
 *
 * @author marcosdj
 */
@ManagedBean
@ViewScoped
public class UsuarioBean extends ServidorRN implements Serializable {

    private ServidorRN rn = new ServidorRN();
    private String usuarioLogado;
    private Servidor servidor = new Servidor();
    private Validator validator = new Validator();
    private List<Servidor> lista;
    private String email, senha, perfil, titulo;

    public UsuarioBean() {
        this.titulo = "CADASTRAR USUÁRIO";
        if (JsfUtil.getSession().getAttribute("UC") != null) {
            Object[] array = (Object[]) JsfUtil.getSession().getAttribute("UC");
            if (array[1] instanceof Servidor) {
                this.servidor = (Servidor) array[1];
            }
        }
    }

    public String irCadPessoal() {
//        validator.verificaSessao();
        return "/publico/index.xhtml?faces-redirect=true";
    }

    public String irCadUsuario() {
        return "/sistema/usuarios/cadastro.xhtml?faces-redirect=true";
    }

    public void alterar() throws IOException {
        FacesContext.getCurrentInstance().getExternalContext().redirect("cadastro.xhtml");
    }

    public void putInSession(Servidor servidor) throws Exception {
        SystemUtil.updateUseCase(servidor, Servidor.class);
    }

    public String sair() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
        session.invalidate();
        return "/autenticacao/login.xhtml";
    }

    public String getUsuarioLogado() {
        SecurityContext context = SecurityContextHolder.getContext();
        if (context instanceof SecurityContext) {
            Authentication authentication = context.getAuthentication();
            if (authentication instanceof Authentication) {
                Servidor temp = rn.obterporEmail(((User) authentication.getPrincipal()).getUsername());
                usuarioLogado = temp.getNome();
            }
        }
        return usuarioLogado;
    }

    public void salvarUsuario() {
        String senhaCriptografada = encriptarSenha(senha);
        servidor.setSenha(senhaCriptografada);
        if (JsfUtil.getSession().getAttribute("UC") == null) {
            save(servidor);
        } else {
            edit(servidor);
        }
        servidor = null;
        RequestContext.getCurrentInstance().addCallbackParam("flag", "ok");
        validator.verificaSessao();
    }

    public void verificaCamposDialog() {
        if (validarCampos()) {
            RequestContext.getCurrentInstance().addCallbackParam("flag", "salvar");
        } else {
            RequestContext.getCurrentInstance().update("formUsuario");
        }
    }

    public void cancelar() throws IOException {
        validator.verificaSessao();
        servidor = new Servidor();
        this.senha = null;        
    }

    public boolean validarCampos() {
        boolean resposta = true;
        if (servidor.getEmail() == null || servidor.getEmail().trim().equals("")) {
            FacesContext.getCurrentInstance().
                    addMessage("msgEmail",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo Email é obrigatório", ""));
            resposta = false;
        }

        if (senha == null || senha.trim().equals("")) {
            FacesContext.getCurrentInstance().
                    addMessage("msgSenha",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo Senha é obrigatório", ""));
            resposta = false;
        }

        if (servidor.getPerfil() == null || servidor.getPerfil().trim().equals("")) {
            FacesContext.getCurrentInstance().
                    addMessage("msgPerfil",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo Perfil é obrigatório", ""));
            resposta = false;
        }

        return resposta;
    }

    public void setUsuarioLogado(String usuarioLogado) {
        this.usuarioLogado = usuarioLogado;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public Servidor getServidor() {
        return servidor;
    }

    public void setServidor(Servidor servidor) {
        this.servidor = servidor;
    }

    public List<Servidor> getLista() {
        List<Servidor> resposta = new ArrayList<>();
        List<Servidor> ltemp = listaDecrescente();
        if (ltemp != null) {
            for (Servidor s : ltemp) {
                if (!s.getNome().trim().equals("ADMINISTRADOR")) {
                    resposta.add(s);
                }
            }
            lista = resposta;
        }
        return lista;
    }

    public void setLista(List<Servidor> lista) {
        this.lista = lista;
    }

    public String getEmail() {
        if (servidor != null) {
            email = servidor.getEmail();
        }
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getPerfil() {
        return perfil;
    }

    public void setPerfil(String perfil) {
        this.perfil = perfil;
    }

}
